home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Taifun / Taifun 013 (1987-05-15)(Ossowski, Stefan)(DE)(PD).zip / Taifun 013 (1987-05-15)(Ossowski, Stefan)(DE)(PD).adf / amigaventure / Instructions < prev    next >
Text File  |  1987-03-04  |  27KB  |  603 lines

  1. Article 5138 of net.micro.amiga:
  2. Relay-Version: version B 2.10.3 4.3bsd-beta 6/6/85; site well.UUCP
  3. Path: well!ptsfa!dual!unisoft!lll-lcc!lll-crg!rutgers!husc6!husc4!hadeishi
  4. From: hadeishi@husc4.harvard.edu (mitsuharu hadeishi)
  5. Newsgroups: net.micro.amiga
  6. Subject: AmigaVenture Programmer's Guide
  7. Message-ID: <468@husc6.HARVARD.EDU>
  8. Date: 19 Oct 86 02:21:20 GMT
  9. Date-Received: 19 Oct 86 12:12:07 GMT
  10. Sender: news@husc6.HARVARD.EDU
  11. Reply-To: hadeishi@husc4.UUCP (mitsuharu hadeishi)
  12. Distribution: net
  13. Organization: Harvard Science Center
  14. Lines: 585
  15.  
  16.  
  17.     The following is a introductory guide to help you get
  18. started writing AmigaVentures with the AmigaVenture 1.17 kernal
  19. posted a few days ago.  This is only a beginning; to actually
  20. learn the details, you must peruse the actual source code and
  21. read the voluminous comments which document the program's operation.
  22. However, you should find the following an invaluable guide to the
  23. murky depths of AmigaVenture.
  24.  
  25.     Enjoy!                -Mitsu
  26.  
  27. ---------------------------------------------------------------------------
  28.  
  29.   Guide to Writing Amiga Ventures
  30.  
  31. ---------------------------------------------------------------------------
  32.  
  33.   By Mitsu Hadeishi 10/18/86
  34.  
  35.   Current mailing address is hadeishi%husc4@harvard.edu
  36.  
  37. ---------------------------------------------------------------------------
  38.  
  39.  
  40.    Q. What is AmigaVenture?
  41.  
  42.    A. AmigaVenture is a program skeleton that allows you to easily
  43. write your own custom text adventures.
  44.  
  45.  
  46.    Q. How flexible is it?
  47.  
  48.    A. AmigaVenture is completely flexible, since it is written in
  49. AmigaBasic.  Most people already know a flavor of Basic, and AmigaBasic
  50. is a natural extension of this.  Becuase AmigaBasic uses alphanumeric
  51. labels instead of line numbers, because it has structured programming
  52. constructs such as IF-THEN-ELSE and WHILE-WEND, and because it allows the
  53. definition of subprograms with local variables, AmigaBasic is very well
  54. suited for the writing of even very sophisticated programs.  And because it
  55. is interpreted rather than compiled (although a compiler is available),
  56. you can test programs immediately.  AmigaBasic is also fast; much faster
  57. than other microcomputer Basics by a large factor.
  58.  
  59.  
  60.    Q. How extensive is the program?
  61.  
  62.    A. AmigaVenture supplies you with all the tools you need to write
  63. a modern text adventure with relative ease.  The program is complicated,
  64. however, and though I've tried to make it as simple as possible, mastering
  65. all of the tools provided may take some time.  
  66.  
  67.  
  68.    Q. What is an adventure?
  69.  
  70.    A. An adventure consists of a set of locations and descriptions,
  71. a set of objects and their properties, and a set of actions the player
  72. can perform within the adventure world.  You can also define characters
  73. that act within the adventure, doing playful things or interacting with
  74. the player.  In addition, you may have events which occur at various
  75. times or places or under certain conditions which change the adventure
  76. significantly.  Within this structure you are free to dream up anything you
  77. like.
  78.  
  79.  
  80.    Q. How does the player interact with the adventure?
  81.  
  82.    A. The player enters a series of commands in an English-like command
  83. language.  An effort has been made to allow the definition of a very
  84. natural command language; the command interpreter is very powerful,
  85. and is capable of understanding something like "Put everything that's in
  86. the bag underneath the table." or "Get everything but the red book and
  87. go north."  This interpreter was developed in stages from a much less
  88. sophisticated interpreter; this was possible because AmigaVenture was
  89. developed in an interpreted language environment.  The current state
  90. of the interpreter is MORE sophisticated than the interpreter found in
  91. many commercial products.
  92.  
  93.    The interpreter is also capable of distinguishing between different
  94. objects through the use of adjectives.  So, for example:
  95.  
  96.   | > get the earring
  97.   |
  98.   | Which earring do you mean:
  99.   | The diamond earring, or the pearl earring?
  100.   |
  101.   | > the pearl
  102.   |
  103.   | Taken.
  104.  
  105.    The interpreter is smart; if the diamond earring is not visible,
  106. then it is assumed the player is not referring to it.
  107.  
  108.    The way this is done is the following: adjectives and nouns are
  109. not distinguished internally.  Following each word in the noun list
  110. are the list of all possible objects or abstract ideas the word could
  111. be referring to.  For example "earring" can refer to, say, two objects,
  112. so the listing might be
  113.  
  114.    DATA earring,6,8,0
  115.  
  116.    This means "earring" could refer to objects 6 or 8.  The 0 is simply
  117. a marker which means "no more entries in the list".  Now "pearl"
  118. only refers to object 6.  When the player enters "pearl" the program
  119. checks to see that the ambiguity has been resolved and continues the
  120. command.
  121.  
  122.    This system works, for the most part, but there are occasional
  123. difficulties.  Usually any problems are easily worked around.
  124. This system has the advantage of being simple and fast, and handles
  125. most things you might want to do.
  126.  
  127.  
  128.    Q. How do you begin to define an adventure?
  129.  
  130.    A. First, draw a map.  The text adventure structure is rather rigid;
  131. it assumes the player is going to be doing a lot of exploring of a
  132. somewhat fixed terrain.  Of course you can define several terrains
  133. disconnected from each other; this is simply a matter of drawing a map
  134. with several disconnected regions.  One region might be the seashore
  135. and another might be an island; or they might be two cities connected
  136. by teleportation boxes; or spaceports connected by a space trip.
  137. Anything goes.
  138.  
  139.    Q. How does the adventure move along?
  140.  
  141.    A. I personally feel that if the player does nothing, the adventure
  142. should move along without him.  That is, there should be things happening
  143. all the time in various parts of the adventure, and if the player doesn't
  144. participate in those events, too bad.  If you want to design a static
  145. universe that doesn't change even though the player just wanders around
  146. in circles, that is easy to do.  I think it is a good idea to throw in
  147. a little spice (like a character who pops up and takes you on an
  148. involuntary tour of the city, or something like this).  The player can
  149. get easily bored if s/he gets "stuck" with no obvious way out.
  150.  
  151.    However, the player is still the prime mover, and the player
  152. interacts with the adventure world through VERBS, or COMMANDS.
  153. (I know, this is a very I-It conception, but that's the nature of this
  154. beast.)  Each verb can have its own properties and can do anything
  155. the designer wishes.  It can print out "Goob." and do nothing.  It can
  156. unlock a magic door.  It can turn on a machine, teleport the player to
  157. another location, tell the player his physical condition, anything.
  158.  
  159.  
  160.    Q. Show me.
  161.  
  162.    A. The designer can write anything s/he wants, but there is a general
  163. protocol that all commands should follow.
  164.  
  165.    In general, there are three places in AmigaVenture that you need to
  166. modify when you implement a new command.  These areas begin with the
  167. labels Verbs:, Commands:, and DoCommand:.
  168.  
  169.    Verbs:
  170.  
  171.    The parser needs a list of all the words which could refer to that
  172. verb.  For example, for the verb Drop: has the following synonyms:
  173. "let go of", "get rid of", "put down", "drop", and "release".  The
  174. parser is capable of handling one, two, and three-word verbs.  The number
  175. you associate with the verb should be the NEXT HIGHER NUMBER from the
  176. highest verb there before.
  177.  
  178.    Commands:
  179.  
  180.    This is where you go next, to put the actual verb definition.
  181. This list is IN ORDER and MUST be IN ORDER.  To add a new command
  182. you simply add a label to the end of the list of commands.  This
  183. label can be anything you want except a reserved AmigaBasic word,
  184. and it should be mnemonic (something you can easily remember).
  185.  
  186.    After your new command label, you put a series of DATA statements
  187. characterizing the grammatical properties of the verb.  For example,
  188. the verb might take only direct objects, and if no direct object
  189. is specified the program might be asked to search the objects not
  190. on the player's person for a possible choice, etc.  A lot of flexibility
  191. is put in these DATA statements which allows the parser to do a lot
  192. of pre-processing even before the verb gets the information.  More on this
  193. later.
  194.  
  195.    DoCommand:
  196.  
  197.    Here you modify the highest verb allowed (change the IF statement),
  198. and add a verb to the list of IF...THEN ON...GOSUB commands.  This
  199. should be self-explanatory.  Make sure to keep the same pattern which
  200. is there already.
  201.  
  202.    HOW TO WRITE THE COMMAND ITSELF
  203.    --- -- ----- --- ------- ------
  204.  
  205.    Let's take a look at a typical command.
  206.  
  207. TurnOn:
  208. DATA 2,0,0
  209. DATA 0,0
  210. DATA 0,0
  211. DATA 2,0
  212.  
  213. IF n < 0 THEN GOSUB Absurd:RETURN
  214. IF n <> lamp THEN GOSUB Cannot:RETURN
  215.  
  216. IF flag(lampon) THEN PRINT FNcap$(nn$(0))" is already on.":RETURN
  217. flag(lampon) = 1
  218. PRINT FNcap$(nn$(0))" is now on.
  219.  
  220. RETURN
  221.  
  222.    Okay.  The first four data statements define grammatical properties
  223. of the verb.  For a full explanation, see the in-code documentation.
  224. This verb says the object must be physically accessible, the verb
  225. takes no indirect objects, it doesn't matter if the object is on the
  226. player or in the room, there is no default search path for an
  227. ambiguity, and you can have as many objects as you want: as in "turn on the
  228. lamp, the machine, and the staircase."
  229.  
  230.    IF n < 0 THEN GOSUB Absurd:RETURN
  231.  
  232.    The first IF statement is saying that the object must be a physical
  233. object, non an abstract noun.  All abstract nouns (i.e. "north", "game",
  234. etc., words that do not refer to verbs or physical objects) have NEGATIVE
  235. numbers to avoid confusion.  This line is typical of many verbs, and
  236. perhaps should be added to the list of default grammatical paramters.
  237. For now, each verb having this restriction (which is most of them)
  238. have this line of code.
  239.  
  240.    IF n <> lamp THEN GOSUB Cannot:RETURN
  241.  
  242.    Before the command is called, some global variables are set first.
  243. The important ones are: n, the direct object code, o, the indirect
  244. object code, and p, the preposition code.  Important string variables
  245. are: n$(0) and nn$(0), strings describing the direct object (n),
  246. n$(1) and nn$(1), strings describing the indirect object (o), and
  247. p$, the preposition string.  n$() typically is just a single word
  248. describing the noun, and nn$() is typically "the "+n$().  You should
  249. use nn$() instead of explicitly writing "the" because some words
  250. (typically abstract nouns, i.e., you don't want to say "you can't pick up
  251. the north!", rather you want to say "you can't pick up north!").
  252.    "lamp" is a variable defined in the Initialize: section of the program,
  253. which is called when the program is started.  Any object which is referred
  254. to specifically should be referred to through a variable so that if
  255. the object number changes this variable can be changed and all the code
  256. will still work.  For example, in your adventure you might have a
  257. different object be the "lamp", and in that case you'd change this
  258. variable.
  259.  
  260.    IF flag(lampon) THEN PRINT FNcap$(nn$(0))" is already on.":RETURN
  261.  
  262.    flag() is an array which is used very heavily in AmigaVenture.
  263. ALL ADVENTURE STATUS NUMBERS should be stored in this array.  This
  264. includes, for example, the positions of various characters you might
  265. program, the time of day, whether or not a magic door is open or not,
  266. etc.  This is so that the LoadGame: and SaveGame: commands do not
  267. need to be modified for every new adventure, and also so that the
  268. status of the adventure is available to the conditional description
  269. processor (see documentation under Map:).  Rather than referring to
  270. the flag directly, it is indexed through the variable "lampon" which
  271. refers to a flag number.  This is done for reasons similar to the above.
  272.    FNcap$() is a string function that returns the same string back,
  273. with the initial letter capitalized.
  274.  
  275.    flag(lampon) = 1
  276.  
  277.    Turn on the lamp.  (Set the flag).
  278.  
  279.    PRINT FNcap$(nn$(0))" is now on.
  280.  
  281.    Prints "The lamp in now on." unless you've changed the word
  282. describing the lamp object.
  283.  
  284.    RETURN
  285.  
  286.    Returns control to the caller.  This is usually the DoCommand:
  287. routine, which branches to PostProcess:.  However, a command may call
  288. another command (you must use the Alias() subprogram to set up the
  289. command stack first; more on this later) so this may be returning control
  290. to another command instead.
  291.  
  292.  
  293.    Q. When would a command call another command?
  294.  
  295.    A. Well, when a command determines that some condition has not been
  296. met for the completion of the command, the command can call another
  297. command in an attempt to rectify this problem.  For example, the player
  298. may want to open a container, but if it is locked, then the program will
  299. automatically try to unlock it first:
  300.  
  301. OpenIt:
  302. DATA 2,0,0
  303. DATA 0,0
  304. DATA 0,0
  305. DATA 2,0
  306.  
  307. IF n < 0 THEN GOSUB Absurd:RETURN
  308. IF folded(n) THEN GOTO UnWrap
  309. IF openable(n) = 0 THEN GOSUB Cannot:RETURN
  310. IF locked(n) THEN
  311.    PRINT"(trying to unlock "nn$(0)" first)
  312.    CALL Alias("unlock",11,(n(0)),0,0):GOSUB Unlock
  313.    GOSUB RestoreCommand
  314.    IF locked(n) THEN RETURN
  315.    PRINT"(then, proceeding . . .)
  316. END IF
  317.  
  318.    Let's stop here.  Now, this code is relatively straightforward to
  319. read.  If the object n happens to be locked, the command prints a message
  320. to the player, and then calls the Unlock command.  After the command
  321. returns, it OpenIt checks to see if the thing is locked (if so, it
  322. just RETURNs), otherwise, it continues and opens the object.
  323.  
  324.    But what is this "Alias" command doing here?  Well, before a command
  325. is called, several variables must be set up (i.e. n, p, o, n$(), nn$(),
  326. and p$, not to mention v$ and v which contain information related to
  327. the verb.)  You call the Alias command with a list of the verb string,
  328. the verb number, the direct object, the preposition code, and the
  329. indirect object code.  That is, CALL Alias("VERB",verb,n,p,o) will set
  330. up the variables you want.  THE EXTRA PARENTHESES AROUND n(0) ARE
  331. NECESSARY.  WHEN YOU DO THIS, YOU PASS THE VALUE OF THE VARIABLE AND NOT
  332. THE VARIABLE ITSELF TO A SUBPROGRAM.  This should be noted carefully
  333. for calling other subprograms as well; sometimes you want the subprogram
  334. to change your variable (to return a value, for example), sometimes you
  335. do not.
  336.  
  337.    What Alias() does is to set up all the appropriate variables so you
  338. can call the command just as though it were being called from DoCommand:
  339. after a command has been interpreted by the parser.  Alias() "fools" the
  340. command into thinking it has been called just like an ordinary command.
  341. The command then does its stuff, printing out whatever messages it
  342. prints out (such as "You idiot! You can't unlock that!") and then
  343. returns.
  344.    But now all of your nice variables have been changed.  You want them
  345. back the way they were before you called the other command.
  346.    The routine RestoreCommand does exactly that.  It restores all of
  347. the variables that you just changed with Alias().  Since a command
  348. can never be sure that another command won't call yet another command,
  349. these values are stored on a "command stack" that keeps track of various
  350. levels of command calling.  This allows up to ten levels of this kind
  351. of tom foolery.  In practice you usually never get above three or four.
  352.  
  353.    It's kind of fun to watch Alias() at work:
  354.  
  355.   | >put the purse in the backpack
  356.   |
  357.   | (taking the purse first): Taken.
  358.   | (opening the backpack first):
  359.   | The backpack is now open.
  360.   | (then, putting the purse in the backpack):
  361.   | Done.
  362.  
  363.    The first Alias() was done by the parser, because it knows the verb
  364. Put: requires that the direct object be in the hands of the player.
  365. The next was done by the Put: command, because it knows to put something
  366. inside something else you have to open it first.
  367.  
  368.    You needn't worry about the internal details of Alias() and
  369. RestoreCommand.  If you use them as in the example above and the examples
  370. in the source code you have, you should have no problems.
  371.  
  372.  
  373.    Q. Could you say something about the properties of objects?
  374.  
  375.    A. Well, let me say something about nouns.  There are basically two
  376. kinds of nouns, the abstract nouns and the concrete nouns.  The concrete
  377. nouns category paradoxically includes adjectives (they are treated just
  378. like regular nouns).  This may sound strange, but it works in practice.
  379.  
  380.    To add a new abstract noun to the vocabulary, you must change the
  381. lists in two places: under Nouns: and under Abstract:.
  382.  
  383.    To add a new concrete object to the vocabulary, you must change
  384. the lists in two places: under Nouns: and under Objects:.
  385.  
  386.    Nouns: contains a list of all nouns and adjectives in the adventure.
  387. Every noun or adjective has a list of numbers after it, terminated by a
  388. zero, which lists all the possible noun codes associated with the noun.
  389. Positive numbers refer to concrete objects in the object list, negative
  390. numbers refer to abstract nouns in the abstract list.
  391.  
  392.    A noun word may refer to both concrete objects and abstract codes.
  393.  
  394.    In the Nouns: list, to add a new word, simply append the word to the
  395. list of nouns and list the objects or abstract nouns this word could
  396. refer to.  This goes for both adjectives and nouns.
  397.  
  398.    If you are adding a new abstract noun, you must also add an entry
  399. to the Abstract: list.
  400.  
  401.    If you are adding a new concete object, you must first specify
  402. all of its properties and its initial location and relation to other
  403. objects in the Objects: list.  Some of the properties you can define
  404. are whether it has a surface, whether you can put things under it
  405. (like a table), how heavy it is, how bulky it is, how much capacity
  406. it has, how much you can fit through its opening (a bottle has a
  407. narrow opening, for example), where it starts off to begin with
  408. and whether it is inside something else to begin with (or on top
  409. of something else, etc.), whether you can roll it up, whether you can
  410. wrap things with it, whether or not it can contain water (if you add
  411. such a thing the NEXT object MUST be WATER, and this object will be
  412. the WATER that is INSIDE the previous one when it is full of water.
  413. For more information about water and its properties, see documentation
  414. under Objects:, WaterLists:, and Fill: and Pour:) and other properties.
  415. You are free to add your own properties, but you must change Initialize:
  416. to read in the new properties correctly and also change LoadGame: and
  417. SaveGame: to load and save these properties in the middle of a game.
  418. How to define these properties is documented under Objects:.  You must
  419. also list some adjectives that the program can use to distinguish it
  420. from other objects when it asks the question: "Which do you mean:
  421. the brown bag or the red bag?".  HOWEVER, WHATEVER YOU SPECIFY HERE WILL
  422. NOT BE USED BY THE PARSER UNLESS YOU ALSO MODIFY THE Nouns: LIST.
  423. (Note: properties of objects are typically stored in arrays.  The current
  424. list of properties is documented in the Quick Reference Guide.)
  425.  
  426.    After you have added the object to the Objects: list, then you should
  427. add all the words and adjectives the player might use to refer to the
  428. object in the Nouns: list.  Of course, if the word is already in the
  429. Nouns: list, then you simply add the code to the list of codes after
  430. the word.  If the word is not there, make up a new code for the word
  431. and add it to the list.  The Nouns: list does not need to be in any
  432. particular order.
  433.  
  434.    For example, suppose I have added the following object to the
  435. Objects list:
  436.  
  437. DATA 21,a small,backpack,canvas,"The label says 'COOP.'"
  438. DATA 3,0,0, 7,7, 7,0,5,0, 15,0,5,0, 1,0,0,0, 1,1,0,0,0,0, 0,4,1,0,0
  439.  
  440.    Now I want to add "small", "backpack", "canvas", and
  441. "pack" to the Nouns: list.
  442.  
  443.    I notice "small", "backpack", and "pack" are already in the list, so
  444. I make the following changes:
  445.  
  446. DATA small,5,7,21,0,satin, . . .
  447. DATA . . . backpack,14,21,0,pack,14,21,0
  448.  
  449.    I then add "canvas" to the list:
  450.  
  451. DATA canvas,21,0
  452.  
  453.    And now I am done.  The new object will appear in my adventure,
  454. and I will be able to manipulate it and do various things with it
  455. (like wear it, open and close it, etc.)
  456.  
  457.  
  458.    Q. Is this all I need to know to write an adventure?
  459.  
  460.    A. You also need to know how to write location descriptions and
  461. how to set up the map.  The descriptions can be made to be conditional;
  462. i.e., certain descriptions only printed when a certain flag is a certain
  463. value, or only during the day, etc.  The map can also be conditional;
  464. you can have a location that just prints a message then forces you to
  465. another location (this is handy for making teleportation doors and
  466. the like, so you get a description like "Your vision blurs, and suddenly .
  467. . ." and then you are put in a new location.)  You can also have a
  468. direction which goes one place if a flag is set, and prints a
  469. message or goes somewhere else if the flag is clear.  See Map: for
  470. a thorough discussion of this (in the program).
  471.  
  472.  
  473.    Q. Anything else?
  474.  
  475.    A. Finally, when you start to write sophisticated code, you will
  476. want to use the various subprograms made available for your use.
  477. Each subprogram is documented in the code itself, but I will list some
  478. of the most noteworthy here.  The labels are used so the programmer
  479. can list them easily; they have no function in the program itself
  480. other than this.
  481.  
  482. Calc:
  483.  
  484.    Visible() allows you to check whether an object is visible to the
  485. player, and you can also add the condition of the object being in
  486. the player's hands or in the room (not in the player's hands).
  487.  
  488.    Avail() is the same, but checks further that the object is physically
  489. available to the player to reach out and grab.  If you don't want this
  490. to be able to happen (force field or something) you must alter the
  491. Take: command to check for force fields, etc.
  492.  
  493.    CheckLight() allows you to check the current lighting situation in
  494. the player's location.
  495.  
  496.    NameNoun() returns n$ and nn$ strings to the caller when they
  497. give it a noun code.
  498.  
  499. Calc2:
  500.  
  501.    ListSib() lists the siblings of an object.  This is used by the
  502. parser and is of little use to a regular adventure programmer.
  503.  
  504.    Inside() determines whether one object is inside another, and
  505. also in what relation (perhaps rather than inside it is on top of
  506. or underneath, or wrapped by that object.)
  507.  
  508.    EvalCond() evaluates a map conditional (used by Look: to determine
  509. whether or not to print conditional descriptions) This is used by
  510. Look: and is of little use to a regular adventure programmer.
  511.  
  512.    RollDice simply puts a random number between 0 and 99 in flag(random).
  513. This is called every move so a map can have random move locations.
  514.  
  515.    ListBottles() lists all the water container's in a player's
  516. possession.  Also of little use to the average adventure programmer.
  517.  
  518. Lists:
  519.  
  520.    Contents() prints a list of the object, all its siblings, and everything
  521. inside of, on top of, wrapped by, and underneath an object.  (Note
  522. that "underneath" refers to something not touching the object, like
  523. something under a table.  If a book is on the table, then the table is
  524. NOT "underneath" the book.  Sounds funny, but its true.)  You can
  525. also specify that it only print what's inside the object and not its
  526. siblings as well.
  527.  
  528.    (A sibling is an object "next" to the object.  I.e., several
  529. books on a table are all siblings, several objects lying free in a
  530. room are siblings.)
  531.  
  532.    Remove() removes an object from relation with everything and
  533. places it in limbo (location 0).  This is how you make something
  534. disappear.  Combined with Insert(), this is how to move something.
  535.  
  536.    Insert() inserts an object into relation with something else.
  537. This might be a room (inside a room) or it might be another object
  538. (in which case it inherits the location of its "parent.")  For
  539. performance reasons this routine ASSUMES YOU HAVE JUST CALLED REMOVE().
  540. You MUST call Remove() prior to calling Insert(), or the list structure
  541. will be badly mangled.
  542.  
  543.    Setloc() allows you to set the location of a particular object and all
  544. of its descendants.
  545.  
  546.    RemList() removes an entire list of objects but does NOT place them
  547. in limbo.  It simply makes them "invisible"; they will not appear in
  548. a Contents() list.  However, if you ask whether they are "there" or
  549. not the Visible() and Avail() routines will still say the same thing
  550. (as before you called RemList()).  This routine is primarily used to
  551. move whole lists of objects around quickly (which is why the objects
  552. are not Setloc()'d) in conjunction with Concat().  The head of the
  553. list is returned.
  554.  
  555.    Concat() is used to concatenate an entire list of objects (the type
  556. removed by RemList()) to another list.  The routine is typically called
  557. after RemList to concatenate a list to another.  In fact, you MUST
  558. call RemList() before calling Concat() or the pointers in the lists
  559. will get mixed up (and you will have STRANGE results, like an object
  560. "appearing" to be in two places at once, etc.)
  561.  
  562. WaterLists:
  563.  
  564.    Fill() fills a water container with the specified amount.  If there
  565. is too much, it stops and returns the actual amount filled.
  566.  
  567.    Empty() empties a water container.
  568.  
  569.    Tumble() takes all objects that are stacked on top of the object
  570. and makes them siblings of the object (and they all fall down).
  571. Used primarily to make things accurate; if you have a stack of
  572. something and throw it in your backpack, the stack will just fall
  573. apart and you'll have a jumble of stuff in your pack.  Not used by
  574. the typical adventure programmer (used in the Place: command).
  575.  
  576.    There are also a bunch of interpreter subprograms which you do
  577. NOT need to fool with unless you want to modify the parser or fix
  578. a bug (heaven forbid) in the parser.  If you want to modify these,
  579. please email me and I'll try to explain how the parser works.
  580. Otherwise please treat it as a black box which takes command lines
  581. and gives you a nice series of verb, direct object, preposition,
  582. indirect object combinations.
  583.  
  584.    If you want to move some of this information to disk, the easiest
  585. way would be to move some or all of the DATA sections and the Initialize:
  586. routine to a separate program, run the program and store the resulting
  587. arrays on disk in random access files.  This would save memory and
  588. allow the creation of larger adventures; however it would slow game
  589. play and slow the development of the adventure.  The advantage of
  590. having everything in DATA statements is that you can easily modify
  591. the adventure and try it out immediately.  This allows a great deal
  592. of creativity and adventure in the writing of the game.  When you are
  593. done fleshing out the structure (perhaps with short descriptions) you
  594. can later put long descriptions, etc. onto disk and thereby enrich the
  595. play environment.  After deleting the documentation comments it should be
  596. possible to write rather large adventures using this system, at least
  597. as large as commericially available adventures and possibly much
  598. larger with careful disk use.  Use your imagination and have fun!
  599.  
  600.                                 -Mitsu
  601.  
  602.  
  603.